package fr.istic.mmm.coursepoursuite.parcours;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.List;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import android.content.Context;

public class Parcours
{
	private String id;
	private String nom;
	private Points points;
	private double distanceTotale;
	private double rythme;
	private double temps;
	
	public Parcours()
	{
		points = new Points();
	}
	
	public String createJSONParcours()
	{
		JSONObject infos = new JSONObject();
		try {
			infos.put("date", this.id);
			infos.put("nom", this.nom);
			infos.put("temps", String.valueOf(temps));
			infos.put("rythme", String.valueOf(rythme));
			infos.put("distanceMoyenne", String.valueOf(distanceTotale));
			
		} catch (JSONException e1) {
			e1.printStackTrace();
		}
		
		JSONArray nom = new JSONArray();
		nom.put(infos);
		JSONObject parcours = new JSONObject();
		try {
			parcours.put("parcours", nom);
		} catch (JSONException e1) {
			e1.printStackTrace();
		}
		return parcours.toString();
	}
	
	public String createJSONPoints()
	{
		JSONArray listePoints = new JSONArray();
		JSONObject currentPoint;
		for(Point p : this.points.getLesPoints())
		{
			currentPoint = new JSONObject();
			try {
				currentPoint.put("lat", String.valueOf(p.getLat()));
				currentPoint.put("lng", String.valueOf(p.getLng()));
				currentPoint.put("tps", String.valueOf(p.getTemps()));
			} catch (JSONException e) {
				e.printStackTrace();
			}
			listePoints.put(currentPoint);
		}
		JSONObject res = new JSONObject();
		try {
			res.put("marker", listePoints);
		} catch (JSONException e1) {
			e1.printStackTrace();
		}
		return res.toString();
	}
	
	
	// Cr�er les fichiers JSON Points et Parcours
	public void createJSONs(Context context)
	{
		// Cr�ation du JSON du parcours
		JSONObject infos = new JSONObject();
		try {
			infos.put("date", this.id);
			infos.put("nom", this.nom);
			infos.put("temps", String.valueOf(temps));
			infos.put("rythme", String.valueOf(rythme));
			infos.put("distanceMoyenne", String.valueOf(distanceTotale));
			
		} catch (JSONException e1) {
			e1.printStackTrace();
		}
		
		JSONArray nom = new JSONArray();
		nom.put(infos);
		JSONObject parcours = new JSONObject();
		try {
			parcours.put("parcours", nom);
		} catch (JSONException e1) {
			e1.printStackTrace();
		}
		
		JSONArray listePoints = new JSONArray();
		JSONObject currentPoint;
		for(Point p : this.points.getLesPoints())
		{
			currentPoint = new JSONObject();
			try {
				currentPoint.put("lat", String.valueOf(p.getLat()));
				currentPoint.put("lng", String.valueOf(p.getLng()));
				currentPoint.put("tps", String.valueOf(p.getTemps()));
			} catch (JSONException e) {
				e.printStackTrace();
			}
			listePoints.put(currentPoint);
		}
		JSONObject res = new JSONObject();
		try {
			res.put("marker", listePoints);
		} catch (JSONException e1) {
			e1.printStackTrace();
		}
		
		// On enleve les espace dans les futurs noms des fichier.
		// Format des noms : parcours : "dd-mm-yyyyHH:mm:ssParcours". Points : "dd-mm-yyyyHH:mm:ssPoints" 
		String filenameParcours = this.id.replaceAll(" ", "");
		filenameParcours +="Parcours";
		String filenamePoints = this.id.replaceAll(" ", "");
		filenamePoints +="Points";
		
		// Cr�ation des deux fichiers
		try {
			// Cr�ation du fichier parcours
			FileOutputStream fos = context.openFileOutput(filenameParcours, Context.MODE_PRIVATE);
			fos.write(parcours.toString().getBytes());
			
			// Cr�ation du fichier point
			fos = context.openFileOutput(filenamePoints, Context.MODE_PRIVATE);
			fos.write(res.toString().getBytes());
		
		} catch (Exception e) {
			System.out.println("EXCEPTION 3");
			e.printStackTrace();
		}
	}
	
	public String getNom() {
		return nom;
	}
	public void setNom(String nom) {
		this.nom = nom;
	}
	public Points getPoints() {
		return points;
	}
	public void setPoints(Points points) {
		this.points = points;
	}
	public String getDate() {
		return id;
	}
	public void setDate(String id) {
		this.id = id;
	}
	public double getDistanceTotale() {
		return distanceTotale;
	}
	public void setDistanceTotale(double distanceTotale) {
		this.distanceTotale = distanceTotale;
	}
	public double getRythme() {
		return rythme;
	}
	public void setRythme(double rythme) {
		this.rythme = rythme;
	}
	public double getTemps() {
		return temps;
	}
	public void setTemps(double temps) {
		this.temps = temps;
	}
	public void addPoint(Point point){
		points.getLesPoints().add(point);
	}
	public String toString()
	{
		DecimalFormat df = new DecimalFormat("#0.00");
		
		int h   = (int) ((this.temps / (1000*60*60)) % 24);
		int m = (int) ((this.temps / (1000*60)) % 60);
		int s = (int) (this.temps / 1000) % 60 ;
		
		String temps = String.format("%02d", h) + ":" + String.format("%02d", m) + ":" + String.format("%02d", s);
		
		return "J'ai parcouru " + df.format(distanceTotale) + "km en " + temps + ", soit un rythme de " + getRythmeString();
	}
	public String getRythmeString(){
		int min = (int) rythme;
	    int sec = (int) ((rythme - min) * 60);
		return min + ":" + sec  + " / km";
	}
	
	// Charge le fichier json de nom name dans un parcours
	public void loadJSON(Context context, String path)
	{
		
		parsePoints(context, path+"Points");
		parseParcours(context, path+"Parcours");
		
	}
	
	public String lectureFichier(Context context, String name)
	{
		String fileContent = "";
		try {
			FileInputStream fis = context.openFileInput(name);
			InputStreamReader isr = new InputStreamReader(fis);
			BufferedReader bufferedReader = new BufferedReader(isr);
			
			StringBuilder sb = new StringBuilder();
			String line;
			try {
				while((line = bufferedReader.readLine()) != null)
				{
					sb.append(line);
				}
				if(null != sb)
				{
					fileContent = sb.toString();
				}
				fis.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
			
			
		} catch (FileNotFoundException e) {
			System.out.println("FICHIER INCONNU");
		}
		return fileContent;
	}
	public void parseParcours(Context context, String name)
	{
		JSONObject jsonObject;
		try {
			jsonObject = new JSONObject(lectureFichier(context, name));
			JSONArray listPointsJSON = jsonObject.getJSONArray("parcours");
			final int taille = listPointsJSON.length();
			if(taille == 1)
			{
				final JSONObject parcoursJSON = listPointsJSON.getJSONObject(0);
				this.setTemps(parcoursJSON.getDouble("temps"));
				this.setDate(parcoursJSON.getString("date"));
				this.setRythme(parcoursJSON.getDouble("rythme"));
				this.setDistanceTotale(parcoursJSON.getDouble("distanceMoyenne"));
			}
			else
			{
				System.out.println("ERROR");
			}
		} 
		
		catch (JSONException e) {
			e.printStackTrace();
		}
	}
	
	// Parse un fichier JSON contenant des points et alimente la liste de points de THIS
	public void parsePoints(Context context, String name)
	{
		
		try {
			JSONObject jsonObject = new JSONObject(lectureFichier(context, name));
			
			JSONArray listPointsJSON = jsonObject.getJSONArray("marker");
			final int taille = listPointsJSON.length();
			
			// On cr�� une nouvelle liste de points qui va contenir les points JSON
			Points points = new Points();
			List<Point> lesPoints = new ArrayList<Point>();
			
			for (int i = 0; i<taille; i++)
			{
				final JSONObject pointJSON = listPointsJSON.getJSONObject(i);
				Point p = new Point();
				p.setLat(pointJSON.getDouble("lat"));
				p.setLng(pointJSON.getDouble("lng"));
				p.setTemps(pointJSON.getDouble("tps"));
				
				lesPoints.add(p);
			}
			points.setLesPoints(lesPoints);
			this.setPoints(points);
			
		} catch (JSONException e) {
			e.printStackTrace();
		}
	}
	
	public static void delete(Context context, String name)
	{
		File dir = context.getFilesDir();
		
		File fileParcours = new File(dir, name+"Parcours");
		fileParcours.delete();
		
		File filePoints = new File(dir, name+"Points");
		filePoints.delete();
	}
	
}
